package desmontec.documentos

import java.util.Calendar
import java.util.GregorianCalendar

import desmontec.alertas.*
import desmontec.query.dpg.DPGQuery
import desmontec.sistema.SecUser

class DpgService {

	private static final String VAZIO = "";
	
	AlertaDPGService alertaDPGService
	def springSecurityService
	static transactional = true

	/**
	 * M�todo que consulta uma DPG com base em v�rios crit�rios de busca
	 * Consulta inicialmente busca todas as DPGs, mas de acordo com os crit�rios de busca
	 * ela pode ser refinada
	 * 
	 * @param DPGQuery query com os crit�rios de busca
	 * @return lista de DPGs
	 */
	def consultarDPG(DPGQuery query) {
			
		def criteria = DPG.createCriteria()
		def listaDPGs = criteria {
			and{
				// concatena o numero a pesquisa
				if(query.numero != null && !VAZIO.equals(query.numero)){
					eq('numero', query.numero)
				}
				// concatena o beneficiario a pesquisa
				if(query.beneficiario != null && !VAZIO.equals(query.beneficiario)){
					like('beneficiario', '%' + query.beneficiario + '%')				
				}
				// concatena o responsavel a pesquisa
				if(query.responsavel != null && !VAZIO.equals(query.responsavel)){
					eq('responsavel.id', query.responsavel)
				}
			}	
			
			// concatena as datas
			if(query.filtrarPorData()){
				// setar intervalo de data
				and {
					ge ("inicioDoPrazoValidade", query.dataInicial)
					le ("fimDoPrazoValidade", query.dataFinal)
				}			
			}
			
			// lenin.medeiros - INICIO
			if(!query.filtrarPorExpiradas()) {
				and {
					 like('flagExpirada', "N")
				}				
			}		
			// lenin.medeiros - FIM
			
			// arthur.marques - INICIO
			// ADICAO DO USUARIO
			and {
				eq ('usuario.id', query.usuario)
			}
			// arthur.marques - FIM
		}
		return listaDPGs
	}
	
	/**
	 * Atualiza o status da DPG (valida ou nao) de acordo com a quantidade de materiais
	 * declarados nas guias relacionadas a mesma. Tambem considera o periodo de validade
	 * da DPG.
	 * 
	 * @param dpgReferente
	 */
	
	//fernado.alves - inicio
	def atualizaValidadeDPG(DPG dpgReferente){

		def mapas = MapaEstocagem.findAllByDpg(dpgReferente)
		def resultadoValidacao = 0
		def qntDinamite = 0
		def qntDetonante = 0
		def qntEspoleta = 0
		def qntEstopim = 0
		def qntEspoletim = 0
		def qntRetardo = 0
		
		def qntMaxima = dpgReferente.materiais
		
		def invalida = false
		
		for (m in mapas){
			def guias = GuiaDeTrafego.findAllByMapaDeEstocagem(m)
			
			for (g in guias){
				qntDinamite += g.dinamite
				qntDetonante += g.cordelDet
				qntEspoleta += g.espoleta
				qntEstopim += g.estopim
				qntEspoletim += g.espoletim
				qntRetardo += g.retardo
			}
			
			if ((qntDinamite > qntMaxima.dinamite) ||
			     (qntEspoleta > qntMaxima.espoleta) ||
				   (qntEstopim > qntMaxima.estopim) ||
				     (qntDetonante > qntMaxima.cordelDet) ||
					   (qntEspoletim > qntMaxima.espoletim) ||
					     (qntRetardo > qntMaxima.retardo)){
				invalida = true
			}
		}
		
		if (invalida){
			dpgReferente.flagExpirada = "S"
			resultadoValidacao = 1
		} else {
			Calendar dataAtual = GregorianCalendar.getInstance();
			if (dataAtual.getTime().after(dpgReferente.fimDoPrazoValidade)){
				dpgReferente.flagExpirada = "S"
				resultadoValidacao = 1
			} else {
			    dpgReferente.flagExpirada = "N"
			}
		}
		
		dpgReferente.save()
		
		return resultadoValidacao
	}	
	//fernando.alves - fim
	
	// LUIZ - INICIO - POR ENQUANTO VAI FICAR COMENTADO
	def consultarDPGsValidas(params){
		def dpgsValidas = DPG.findAllByFlagExpiradaAndUsuario("N", (SecUser) springSecurityService.getCurrentUser(), params);
		return dpgsValidas;
	}
	
	def consultarDPGs(params) {
		//return DPG.list();
		//fernando.alves - inicio
		return DPG.findAllByUsuario((SecUser) springSecurityService.getCurrentUser(), params)
		//fernando.alves - fim
	}
	
	def expirarDPGsValidade() { 
		List<DPG> dpgsValidas = DPG.findAll()
		Calendar meuCalendario = GregorianCalendar.getInstance()
		Date dataAtual = meuCalendario.getTime()
		for (dpg in dpgsValidas) {
			//fernando.alves - inicio
			Date dataDPG = dpg.getFimDoPrazoValidade();
				
			if (dataAtual.after(dataDPG)) {
				dpg.flagExpirada = "S"
				dpg.save(flush: true)
				alertaDPGService.adicionaAlertaDPG(dpg, TipoAlerta.ALERTA_DATA_INVALIDA)
			} else {
				//adiciona alerta para o limite de 30 dias
				meuCalendario = GregorianCalendar.getInstance()
				meuCalendario.add(Calendar.DAY_OF_MONTH, 30)
				def dataPrazo = meuCalendario.getTime()
				if (dataPrazo.after(dataDPG)){
					dpg.save(flush: true)
					alertaDPGService.adicionaAlertaDPG(dpg, TipoAlerta.ALERTA_VENCIMENTO_PROXIMO)
				}
					
			}
		   //fernando.alves - fim
		}
		
	}
	
	// LUIZ - FIM
}
